package com.example.demo.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * JSON工具类，用于对象与JSON字符串的相互转换
 * 提供了序列化和反序列化的静态方法，方便在应用中使用
 * 内部使用Jackson库实现JSON处理
 */
@Component
public class JsonUtil {
    
    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class);
    // Jackson的核心类，用于JSON操作
    private static final ObjectMapper objectMapper = new ObjectMapper();
    
    // 静态初始化块，配置ObjectMapper
    static {
        // 配置ObjectMapper以处理Java 8日期/时间类型（如LocalDateTime）
        objectMapper.registerModule(new JavaTimeModule());
        // 格式化输出，使JSON字符串更易读
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        // 处理空对象，避免序列化空对象时抛出异常
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    }
    
    /**
     * 将对象转换为JSON字符串
     * 
     * @param object 要转换的对象，可以是任何Java对象
     * @return 转换后的JSON字符串，如果转换失败则返回null
     */
    public static String toJson(Object object) {
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            // 记录错误日志，但不抛出异常，返回null表示转换失败
            logger.error("转换对象到JSON失败: {}", e.getMessage());
            return null;
        }
    }
    
    /**
     * 将JSON字符串转换为指定类型的对象
     * 
     * @param json JSON字符串
     * @param clazz 目标类型的Class对象
     * @param <T> 目标类型的泛型参数
     * @return 转换后的对象实例，如果转换失败则返回null
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return objectMapper.readValue(json, clazz);
        } catch (JsonProcessingException e) {
            // 记录错误日志，但不抛出异常，返回null表示转换失败
            logger.error("从JSON转换到对象失败: {}", e.getMessage());
            return null;
        }
    }
    
    /**
     * 获取配置好的ObjectMapper实例
     * 可用于需要直接使用ObjectMapper的场景
     * 
     * @return 已配置的ObjectMapper实例
     */
    public static ObjectMapper getObjectMapper() {
        return objectMapper;
    }
} 